<?php
/**
* @File name: datamysql.php
* @author: 李枨煊[Email:lcx165@gmail.com]
* @Date: Wed Aug 22 12:00:47 CST 2007
* @Desription: MySQL操作类
*/
class DataMysql{
	private $modeType = MYSQL_ASSOC;
	private $host;
	private $user;
	private $pass;
	var $database;
	var $debug;
	public $link = null;
	
	/**
	 * 构造方法
	 *
	 * @return Data_DbMysql
	 */
	public function __construct($host, $user, $pass, $database, $debug=true)
	{
		$this->host = $host;
		$this->user = $user;
		$this->pass = $pass;
		$this->database = $database;
		$this->debug=$debug;
		$this->link = $this->getLink();
	}
	
	/**
	 * 析构
	 *
	 */
//	function __destruct()
//	{
//		$this->disConnect();
//	}
	
	/**
	 * 取得mysql数据库连接句柄
	 *
	 * @return int mysql连接句柄
	 */
	public function getLink()
	{
		if ($this->link != null)
		{
			return $this->link;
		}
		else
		{
			$link = mysql_pconnect($this->host, $this->user, $this->pass, true);
			mysql_select_db($this->database,$link);
			mysql_set_charset('utf8',$link);
			return $link;
		}
	}
	/**
	 * 查询数据库

	 *
	 * @param string $sql
	 */
	public function query($sql)
	{
		$result = @mysql_query($sql, $this->link);
		
		//报错
		if($result === false && $this->debug === true)
		{
			require_once(SUIKEE_DIR.'/class/common/stx.class.php');
			$stx = new STX('mysql');
			$sql = $stx->stx_string($sql);
			echo  '<b>ERROR_NUMBER</b> : '.mysql_errno($this->getLink()) . '<br /><b>ERROR_INFO</b> : ' . mysql_error($this->getLink()) . '<br /><b>ERROR_SQL</b> : ' . $sql . '<br /><br /><br />';
			return false;
		}
		return $result;
	}
	
	/**
	 * 关闭连接
	 *
	 * @return int
	 */
	public function disConnect(){
		$ret = @mysql_close($this->link);
		$this->link = null;
		return $ret;
	}
	
	 /**
	 * 设置查询结果返回数据类型
	 *
	 * @param int $modeType 设置查询结果返回设置,1为关联索引和数字所有都有,2为使用关联索引,3为使用数字索引
	 */
	public function setFetchMode($modeType)
	{
		switch ($modeType){
			case 1:	//数字索引和关联索引都有
				$this->modeType = MYSQL_BOTH;
				break;
			case 2:	//使用关联索引
				$this->modeType = MYSQL_ASSOC;
				break;
			case 3: //使用数字索引
				$this->modeType = MYSQL_NUM;
				break;
			default://缺省使用关联索引
				$this->modeType = MYSQL_ASSOC;
		}
	}
	
	/**
	 * 返回一堆结果
	 *
	 * @param string $sql	SQL语句
	 * @return array	结果集
	 */
	public function getRows($sql)
	{
		$record = array();
		$result = $this->query($sql);		

		while ($row = mysql_fetch_array($result,$this->modeType))
		{
			$record[] = $row;
		}
		@mysql_free_result($result);
		return $record;
	}
	
	/**
	 * 返回一堆结果（对象）

	 *
	 * @param string $sql	SQL语句
	 * @return array	结果集

	 */
	public function getRows_obj($sql)
	{
		$record = array();
		$result = $this->query($sql);		

		while ($row = mysql_fetch_object($result))
		{
			$record[] = $row;
		}
		@mysql_free_result($result);
		return $record;
	}
	
	/**
	 * 执行sql返回该语句影响的行数,如update,delete
	 *
	 * @param string $sql
	 * @return int 
	 */
	public function execute($sql)
	{
		if (!$this->query($sql))
		{
			return false;
		}
	   return $this->getAffectedRows();
	}
	
	/**
	 * 获取上次插入操作的的ID
	 *
	 * @return int 如果没有连接或者查询失败,返回0, 成功返回ID
	 */
	public function getLastInsertId()
	{
		if (!$this->link)
		{
			return 0;
		}
		if (($last_id = mysql_insert_id($this->link)) > 0)
		{
			return $last_id;
		}
		return $this->getOne("SELECT LAST_INSERT_ID()");
	}
	
	/**
	 * 获取单行记录(一维数组)
	 *
	 * @param string $sql 需要执行查询的SQL语句
	 * @return array 成功返回结果记录的一维数组,失败返回false
	 */
	function getRow($sql)
	{
		$result = $this->query($sql);
		$record = array();
		$record = @mysql_fetch_array($result, $this->modeType);
		@mysql_free_result($result);
		if (!is_array($record) || empty($record))
		{
			return false;
		}
		return $record;
	}
	
	/**
	 * 获取单行记录(一维数组)
	 *
	 * @param string $sql 需要执行查询的SQL语句
	 * @return array 成功返回结果记录的一维数组,失败返回false
	 */
	function getRow_obj($sql)
	{
		$result = $this->query($sql);
		$record = @mysql_fetch_object($result);
		@mysql_free_result($result);

		return $record;
	}
	
	 /**
	 * 获取一个数据(当条数组)
	 *
	 * @param string $sql 需要执行查询的SQL
	 * @return 成功返回获取的一个数据,失败返回false
	 */
	function getOne($sql, $field='')
	{
		if (!$result = $this->query($sql))
		{
			return false;
		}
		$record = array();
		$row = @mysql_fetch_array($result, $this->modeType);
		@mysql_free_result($result);
		if (!is_array($row) || empty($row)){
			return false;
		}
		if (trim($field) != '')
		{
			$record = $row[$field];
		}else{
			$record = current($row);
		}
		return $record;
	}
	
	/**
	 * 获取一列数据(一维数组)
	 *
	 * @param string $sql 需要获取的字符串
	 * @param string $field 需要获取的列,如果不指定,默认是第一列
	 * @return 成功返回提取的结果记录的一维数组,失败返回false
	 */
	function getCol($sql, $field='')
	{
		if (!$result = $this->query($sql))
		{
			return false;
		}
		$record = array();
		while($row = @mysql_fetch_array($result, $this->modeType))
		{
			if (trim($field) == '')
			{
				$record[] = current($row);
			} else {
				$record[] = $row[$field];
			}
		}
		@mysql_free_result($result);
		if (!is_array($record) || empty($record))
		{
			return false;
		}
		return $record;		
	}
	
	/**
	 * 获取受到影响的记录数量 (用于Update/Delete/Insert操作)
	 *
	 * @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量
	 */
	function getAffectedRows()
	{
		if (!$this->link)
		{
			return 0;
		}
		return mysql_affected_rows($this->link);
	}
	
	/**
	 * 返回一个数据表的字段总数
	 *
	 * @param  $table_name
	 * @return 表的字段总数
	 */
	function getFieldSum($table_name)
	{
		$sql = 'select * from '.$table_name.' limit 1';
		return mysql_num_fields($this->query($sql));
	}
	
	 /**
	 * 返回一个表的字段名和类型的数组
	 *
	 * @param  $table_name	表名
	 * @return 这个表的字段名数组
	 */
	function getFieldNames($table_name)
	{
		$fieldNames = array();
		$sql = 'select * from '.$table_name.' limit 1';
		$rs = $this->query($sql);
		$fieldSum = mysql_num_fields($rs);
		if ($fieldSum > 0)
		{
			for ($i=0; $i<$fieldSum; $i++)
			{
				$tempArray['field_name'] = mysql_field_name($rs, $i);
				$tempArray['field_type'] = mysql_field_type($rs, $i);
				$fieldNames[] = $tempArray;
			}
			return $fieldNames;
		}
		else 
		{
			return false;
		}
	}
	
}

// 创建实例
$db = new DataMysql($cfg_db['host'], $cfg_db['user'], $cfg_db['pass'], $cfg_db['database'], $cfg_db['debug']);